class MySet{

  constructor(arr=[]){
    // 去重后接收数组
    this.arr = arr.filter((item,index)=>arr.indexOf(item)===index)
    this.size = this.arr.length
  }

  updateSize(){
    this.size = this.arr.length
  }

  /* 判断某元素是否存在 */
  has(value){
    return (this.arr.indexOf(value) !== -1)
  }

  /* 添加元素（自动去重）（没有就添加） */
  add(value){
    if(!this.has(value)){
      this.arr.push(value)
      this.updateSize()
    }
  }

  /* 删除元素 */
  delete(value){
    for(let i=0;i<this.arr.length;i++){
      if(this.arr[i]===value){
        this.arr.splice(i,1)
        this.updateSize()
        break
      }
    }
  }

  /* 清空元素 */
  clear(){
    this.arr = []
    this.updateSize()
  }

  /* 查询所有 */
  values(){
    return this.arr
  }

  /* 遍历 */
  forEach(handler){
    for(let i=0;i<this.arr.length;i++){
      // handler(this.arr[i],this.arr[i],this)

      // 将handler中的this绑定为当前Set实例
      handler.apply(this,[this.arr[i],this.arr[i],this])
    }
  }

}

~function testMySet(){
  const set = new MySet()
  // const set = new MySet([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8])
  // console.log(set.size);

  /* 数据已经实现了去重 */

  /* 增删改查 */
  set.add(2)
  set.add(5)
  set.add(7)
  set.add(10)
  set.add(10)

  // 删除元素
  // set.delete(5)
  // set.clear()

  console.log(set.has(2));
  console.log(set.has(15));

  console.log(set.values());
  for (const iterator of set.values()) {
      console.log(iterator);
  }
  console.log("=====");

  set.forEach(
      // (value, value2,s) => console.log(value, value2)
      function(value,value2,s){
        // console.log("this in handler",this,);//window
        console.log("this.size",this.size);
        console.log(value, value2)
      }
  )

  console.log(set);
}()